<?php
/**
 * Classe de gestion des requêtes sur la base de données
 *
 * @category librairies
 * @package sh
 *
 * @author Mickaël CASTANHEIRO
 * @version 1.0
 */
class shSGBD extends shBase {
    /**
     * @access private
     * @var shSGBD
     */
    private static $instance;

    /**
     * @access protected
     * @var PDO
     */
    protected $pdo;


    /**
     * Accès au singleton de la classe
     * Génère le singleton de la classe si cela n'a pas été fait.
     * Retourne simplement l'instance unique sinon
     * @return <shSGBD> Instance unique de la classe
     */
    public function __instance() {
	if ( !(self::$instance instanceof shSGBD) )
	    self::$instance = new shSGBD;
	return self::$instance;
    }


    /**
     * Constructeur de la classe
     * @access private
     * @return shSGBD Instance crée
     */
    private function __construct() {
	$this->pdo = new PDO('mysql:dbname='.DB_NAME.';host='.DB_HOST, DB_USER, DB_PASSWORD);
	$this->pdo->exec('SET NAMES utf8');
    }

    /**
     * Requête de sélection
     * @param <string> Requête
     * @param <array> Variables
     * @return <array> Résultats
     */
    public static function select($_request, $_values=array()) {

	$pdo = self::__instance()->getPdo();
	$query = $pdo->prepare($_request);
	$query->execute($_values);
	$query->setFetchMode(PDO::FETCH_OBJ);
	$results = $query->fetchAll();

	$error = $query->errorInfo();
	if ( $error[1] != null )
	    throw new Exception($error[2], $error[1]);
	

	return $results;
    }



    /**
     * Requête de sélection
     * @param <string> Requête
     * @param <array> Variables
     * @return <Object> Résultat unique ou false
     */
    public static function selectOne($_request, $_values=array()) {

	$pdo = self::__instance()->getPdo();
	$query = $pdo->prepare($_request);
	$query->execute($_values);
	$query->setFetchMode(PDO::FETCH_OBJ);
	$results = $query->fetchAll();

	$error = $query->errorInfo();
	if ( $error[1] != null )
	    throw new Exception($error[2], $error[1]);

	if (empty($results)) return false;
	else return $results[0];
    }

    /**
     * Requête de sélection (comptage)
     * @param <string> Requête
     * @param <array> Variables
     * @return <integer> Nombre de résultats
     */
    public static function count($_request, $_values=array()) {

	$pdo = self::__instance()->getPdo();
	$query = $pdo->prepare($_request);
	$query->execute($_values);
	$query->setFetchMode(PDO::FETCH_COLUMN, 0);
	$result = $query->fetch();

	$error = $query->errorInfo();
	if ( $error[1] != null )
	    throw new Exception($error[2], $error[1]);

	return (is_numeric($result) ) ? $result : 0;
    }

    /**
     * Requête d'insertion
     * @param <string> Requête
     * @param <array> Variables
     */
    public static function insert($_request, $_values=array()) {
	$pdo = self::__instance()->getPdo();
	$query = $pdo->prepare($_request);
	$query->execute($_values);

	$error = $query->errorInfo();
	if ( $error[1] != null )
	    throw new Exception($error[2], $error[1]);

	return $pdo->lastInsertId();
    }

    /**
     * Requête de mise à jour
     * @param <string> Requête
     * @param <array> Variables
     */
    public static function update($_request, $_values=array()) {
	$pdo = self::__instance()->getPdo();
	$query = $pdo->prepare($_request);
	$query->execute($_values);

	$error = $query->errorInfo();
	if ( $error[1] != null )
	    throw new Exception($error[2], $error[1]);
    }

    /**
     * Requête de suppression
     * @param <string> Requête
     * @param <array> Variables
     */
    public static function delete($_request, $_values=array()) {
	$pdo = self::__instance()->getPdo();
	$query = $pdo->prepare($_request);
	$query->execute($_values);
	
	$error = $query->errorInfo();
	if ( $error[1] != null )
	    throw new Exception($error[2], $error[1]);
    }

}
?>